library(tidyverse)
ggplot(cars) + 
  aes(dist, speed) + 
  geom_point(size = 7) + 
  aes(color = speed) + 
  scale_color_viridis_c(limits = c(0,26)) + 
  scale_x_continuous(limits = c(0,125)) +
  scale_y_continuous(limits = c(0,25))

data_filter <- function(keep) {
  structure(list(keep_specification = rlang::enquo(keep)), 
            class = "wipeobs")
}

ggplot_add.wipeobs <- function(object, plot, object_name) {
  
  new_data <- dplyr::filter(plot$data, 
                            !! object$keep_specification)
  plot$data <- new_data
  plot

  }

last_plot() + 
  data_filter(keep = dist > 60)

ggplot(cars) + 
  aes(dist, speed) + 
  geom_point(size = 7) + 
  aes(color = speed)

data_replace <- function(data) {
  structure(list(new_data_specification = data), 
            class = "wipedata")
}

ggplot_add.wipedata <- function(object, plot, object_name) {
  
  plot$data <- object$new_data_specification
  plot

  }


last_plot() + 
  data_replace(data = cars %>% filter(dist > 50))

drob_funs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2024/2024-07-09/drob_funs.csv')

drob_funs %>% 
  ggplot() + 
  aes(y = funs) + 
  aes(y = fct_infreq(funs)) +
  aes(y = fct_infreq(funs) %>% fct_rev()) +
  geom_bar() ->
p; p

p + 
  data_replace(drob_funs %>% 
             group_by(funs) %>% 
             filter(n() > 500))

p + 
  data_filter(pkgs == "ggplot")

p + 
  data_filter(pkgs == "dplyr")

p + 
  data_filter(pkgs == "tidyr")

p + 
  data_filter(pkgs == "base")

# might not work
data_group <- function(group) {
  structure(list(group_specification = rlang::enquo(group)),
            class = "data_grouping")
}

ggplot_add.data_grouping <- function(object, plot, object_name) {

  new_data <- dplyr::group_by(plot$data,
                            !! object$group_specification)
  plot$data <- new_data
  plot

}

p +
  data_group() +
  data_filter(n() > 500)

data_mutate <- function(.value, .by) {
  structure(list(sum_specification = rlang::enquo(.value),
                 by_specification = rlang::enquo(.by)),
            class = "data_summary")
  
}

ggplot_add.data_summary <- function(object, plot, object_name) {

  
  new_data <- dplyr::mutate(plot$data, .value =
                            !! object$sum_specification, 
                            .by = !! object$by_specification)
    message("New variable named '.value' created")

  plot$data <- new_data
  plot

  
  }


p + 
  data_mutate(.value = n(), 
              .by = funs) +
  data_filter(.value > 500)

drob_funs %>% 
  ggplot() + 
  aes(id = funs) + 
  ggcirclepack::geom_circlepack() + 
  ggcirclepack::geom_circlepack_text() + 
  coord_equal() +
  aes(fill = I("grey")) ->
plot_all

plot_all + 
  data_filter(pkgs == "ggplot")

plot_all + 
  data_filter(pkgs == "base")

plot_all + 
  data_filter(pkgs == "tidyr")

plot_all + 
  data_filter(pkgs == "dplyr")

plot_all + 
  data_filter(pkgs == "stringr")

library(tidyverse)

drob_funs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2024/2024-07-09/drob_funs.csv')

data_mutate_filter <- function(.value, .by, keep) {
  structure(list(sum_specification = rlang::enquo(.value),
                 by_specification = rlang::enquo(.by),
                 keep_specifiction = rlang::enquo(keep)),
            class = "data_mutatefilter")
  
}

ggplot_add.data_mutatefilter <- function(object, plot, object_name) {

  
  new_data <- dplyr::mutate(plot$data, .value =
                            !! object$sum_specification, 
                            .by = !! object$by_specification) %>% 
    dplyr::filter(!! object$keep_specifiction)
    message("New variable named '.value' created")

  plot$data <- new_data
  plot

  
  }


drob_funs %>% 
  ggplot() + 
  aes(id = paste(funs, pkgs)) + 
  ggcirclepack::geom_circlepack() + 
  ggcirclepack::geom_circlepack_text(aes(label = funs)) + 
  coord_equal() +
  aes(fill = pkgs) + 
  guides(fill = "none")

last_plot() +
  data_mutate_filter(.value = n(),       
                     .by = c(funs, pkgs), 
                     keep = .value >= 200) 

last_plot() +
  aes(group = pkgs) 

# ggcirclepack:::StatCirclepack$compute_panel
# 
# StatCirclepack <- ggcirclepack:::StatCirclepack
# StatCirclepack$compute_panel <- function (data, scales, npoints = 50, fun = sum) 
# {
#     if (is.null(data$slice)) {
#         data$slice <- TRUE
#     }
#     data <- data %>% dplyr::filter(.data$slice)
#     grp_cols <- c("id", "fill", "alpha", "colour", "linewidth", 
#         "label", "size", "linetype", "render")
#     data <- data %>% group_by(group_by(pick(any_of(grp_cols))))
#     if (is.null(data$area)) {
#         data$area <- 1
#     }
#     if (is.null(data$wt)) {
#         data$wt <- 1
#     }
#     data <- data %>% summarize(area = fun(.data$area * .data$wt), 
#         .groups = "drop")
#     data <- data %>% arrange(id)
#     if (is.null(data$within)) {
#         data$within <- 1
#     }
#     data <- data %>% group_by(.data$within) %>% mutate(prop = .data$area/sum(.data$area)) %>% 
#         mutate(percent = round(.data$prop * 100))
#     data$id = 1:nrow(data)
#     data %>% pull(area) %>% packcircles::circleProgressiveLayout(sizetype = "area") %>% 
#         packcircles::circleLayoutVertices(npoints = npoints) %>% 
#         left_join(data, by = join_by(id))
# }
knitr::knit_exit()